package com.ssy.lingxi.order.service.base;

import com.ssy.lingxi.common.response.Wrapper;
import com.ssy.lingxi.order.entity.OrderConsigneeDO;
import com.ssy.lingxi.order.entity.OrderDO;
import com.ssy.lingxi.order.entity.OrderProductDO;
import com.ssy.lingxi.order.model.dto.OrderConsigneeDTO;
import com.ssy.lingxi.order.model.dto.SupplyProductDTO;
import com.ssy.lingxi.order.model.vo.basic.request.BuyerOrderConsigneeVO;
import com.ssy.lingxi.order.model.vo.basic.request.OrderConsigneeVO;
import com.ssy.lingxi.order.model.vo.basic.response.DeliveryConsigneeDetailVO;
import com.ssy.lingxi.order.model.vo.basic.response.OrderConsigneeDetailVO;

import java.util.List;

/**
 * 订单收货人信息相关接口
 * @author 万宁
 * @version 2.0.0
 * @date 2021-07-19
 */
public interface IBaseOrderConsigneeService {
    /**
     * 校验并生成订单收货人信息
     * @param order       订单
     * @param consigneeVO 订单收货人接口参数
     * @param isCreate 是否新增，true-新增，false-修改
     * @return 操作结果
     */
    Wrapper<Void> checkOrderConsignee(OrderDO order, OrderConsigneeVO consigneeVO, boolean isCreate);

    /**
     * 校验并生成订单收货人信息
     * @param order       订单
     * @param consigneeVO 订单收货人接口参数
     * @param isCreate 是否新增，true-新增，false-修改
     * @return 操作结果
     */
    Wrapper<Void> checkPurchaseOrderConsignee(OrderDO order, BuyerOrderConsigneeVO consigneeVO, boolean isCreate);

    /**
     * （转单） - 生成供应商收货人信息，计算订单运费
     * @param orders 转单前的订单列表
     * @param orderProducts 转单前的订单商品列表
     * @param supplyProducts 上级供应商商品列表
     * @return 转单订单的收货人信息列表
     */
    Wrapper<List<OrderConsigneeDTO>> findVendorConsignees(List<OrderDO> orders, List<OrderProductDO> orderProducts, List<SupplyProductDTO> supplyProducts);

    /**
     * （转单） - 校验并生成转单订单收货人信息
     * @param order       转单订单
     * @param consigneeDTO 物流服务返回的收货人信息
     * @return 操作结果
     */
    Wrapper<Void> transferOrderConsignee(OrderDO order, OrderConsigneeDTO consigneeDTO);

    /**
     * 查询订单交付人信息
     * @param order 订单
     * @return 订单收货人信息
     */
    OrderConsigneeDetailVO getOrderConsignee(OrderDO order);

    /**
     * 订单收货地址转字符串地址
     * @param consignee 订单收货人信息
     * @return 拼接后的收货地址字符串
     */
    String orderConsigneeToString(OrderConsigneeDO consignee);

    /**
     * 订单收货地址转字符串地址
     * @param consignee 订单收货人信息
     * @return 拼接后的字符串 省市区地址
     */
    String orderConsigneeToArea(OrderConsigneeDO consignee);

    /**
     * 销售发货单-根据订单id查询收货人信息
     * @param orderId 订单id
     * @return 订单收货人信息
     */
    DeliveryConsigneeDetailVO getOrderConsignee(Long orderId);
}
